<?php

namespace app\attachment\controller;

use think\Controller;
use think\Loader;
use think\Image;
use OSS\Core\OssException;

class Base extends Controller
{
    protected $userid;
    protected $userinfo;
    protected $request;
    //七牛连接域名
    protected $qiniu_url = 'http://image.xmyeditor.com/';
    protected $base_url = 'http://image.xmyeditor.com/';//
    protected $platforms;
    //云存储平台 0：七牛  1：OSS
    protected $upload_platform = 0;
    //模型
    protected $model;
    //上传真实路径
    protected $upload_path;
    //上传目录
    protected $upload_dir;
    protected $error;
    //用户打水印信息
    protected $waterinfo = [];

    protected function initialize()
    {
        parent::initialize();
        $this->upload_path = config("upload")['path_name'];
    }






    /**
     * 生成缩略图
     * @param $imgurl
     * @param array $options
     * @return bool|string
     */
    protected function thumb($imgurl, $options = [])
    {
        //如果源图片地址为空，则返回默认空图片
        if (empty($imgurl)) {
            $this->error = '要生成缩略图的源图不存在';
            return false;
        }
        $realurl = SITE_PATH . $imgurl;
        //判断源图是否是文件，查询源图是否存在
        if (!is_file($realurl)) {
            $this->error = '源文件不存在';
            return false;
        }
        $realurl_info = @getimagesize($realurl);
        //默认图片最大为1000
        $width = isset($options['width']) ? $options['width'] : 1000;
        //默认图片最大宽度为1000
        $height = isset($options['height']) ? $options['height'] : 1000;
        $width = $realurl_info[0] > $width ? $width : $realurl_info[0];
        //$height = $realurl_info[1] > $height ? $height * ($realurl_info[1] / $realurl_info[0]) : $realurl_info[1];
        $height = $height * ($realurl_info[1] / $realurl_info[0]);

        //获取图片的绝对路径（本地路径 ）
        $file_array = pathinfo($imgurl);
        //文件所在目录
        $dirname = (string)$file_array['dirname'];
        //文件名字
        $filename = (string)$file_array['filename'];
        //文件后缀
        $extension = (string)$file_array['extension'];

        //此次要生成的缩略图及完整路径
        $thumb_name = "{$dirname}/{$filename}_thumb.{$extension}";

        //打开一个图片文件
        $image = Image::open($realurl);
        //保存图像
        $image->thumb($width, $height, 1)->save(SITE_PATH . $thumb_name);
        //上传的图片不能超过2M，否则微信通不过
        $max_length = 2 * 1048576;
        $thumb_size = filesize(SITE_PATH . $thumb_name);
        if ($thumb_size < $max_length) {
            @unlink($realurl);
            return $thumb_name;
        }
        if ('png' == strtolower($extension)) {
            //第二次生成为最大宽度600的图片  //保存图像
            $image->thumb(600, 600, 1)->save(SITE_PATH . $thumb_name);
            $thumb_size = filesize(SITE_PATH . $thumb_name);
            if ($thumb_size < $max_length) {
                @unlink($realurl);
                return $thumb_name;
            }
            //第三次生成为最大宽度400的图片  //保存图像
            $image->thumb(400, 400, 1)->save(SITE_PATH . $thumb_name);
            return $thumb_name;
        }
        return $thumb_name;
    }


    /**
     * 获取文件后缀
     * @param $filename
     * @return mixed
     */
    protected function getExt($filename)
    {
        $info = pathinfo($filename);
        return strtolower($info['extension']);
    }


    /**
     * 上传的文件及路径（每千人分配一个目录）
     *
     * @param $userid  用户ID
     * @param bool|true $truepath 是否为真实路径
     * @return string
     */
    protected function getUploadPath($userid, $truepath = true)
    {
        //会员登录后以用户ID来判断登录目录，未登录时，则写入到0目录中
        if ($userid < 1) {
            $user_dir = '0/';
        } else {
            $user_dir = ceil($userid / 1000) . '/' . $userid . '/';
        }
        //文件上传保存目录
        if ($truepath) {
            $dir = $this->upload_path . $user_dir;
            if (!is_dir($dir)) {
                @mkdir($dir, 0777, true);
            }
        } else {
            $dir = $this->upload_dir . $user_dir;
        }
        return $dir;
    }

    /**
     * 检测用户权限
     * @return array
     */
    protected function checkUser()
    {
        if (empty($this->userinfo)) {
            return false;
        }
        $this->userid = isset($this->userinfo['id']) ? intval($this->userinfo['id']) : 0;
        if ($this->userid < 1) {
            return false;
        }
        return true;
    }


    /**
     * 检测用户上传是否超过限制，用户的
     * @param int $filesize
     * @return bool
     */
    protected function checkFileSize($filesize = 0, $ext = 'jpg')
    {
        $filesize = intval($filesize);
        //判断是否GIF并且超过1M
        if ($ext == 'gif' && $filesize > 1048576) {
            $this->error = 'GIF图片不能超过1M';
            return false;
        }
        if (!in_array($ext, ['jpg', 'jpeg', 'png', 'gif'])) {
            $this->error = '非法文件类型';
            return false;
        }

        //1:V0用户   2：V1用户   3：V2用户   4：V3用户
        $group_id = isset($this->userinfo['group_id']) ? intval($this->userinfo['group_id']) : 1;
        //用户允许的最大上传限制
        $group_size = [1 => 2, 2 => 3, 3 => 5, 4 => 8];
        //用户可上传的最大值 字节
        $allow_size = intval($group_size[$group_id] * 1048576);
        if ($filesize > $allow_size) {
            $this->error = '已超出最大上传限制:' . $group_size[$group_id] . 'M';
            return false;
        }
        //判断用户的所传数量是否超出限度
        $groups = createCache('user_grade');
        $info = isset($groups[$group_id]) ? $groups[$group_id] : [];
        //初始化最低150条每月
        $allow_upload_num = 150;
        if ($info) {
            $allow_upload_num = intval($info['upload_number']);
        }
        //查询用户本月已上传的数量
        $month_start_time = strtotime(date('YM'));
        //本月已上传的文件数量
        $upload_count = getHashAttrModel('Attachment', $this->userinfo['id'], $this->table_number)->where(['user_id' => $this->userinfo['id'], 'is_sync' => 0, 'create_time' => ['gt', $month_start_time]])->count();
        if ($upload_count >= $allow_upload_num) {
            $this->error = '您上传的图片数量已超出最大限制' . $allow_upload_num . '张';
            return false;
        }
        return true;
    }




    /**
     * 返回错误信息
     * @return mixed
     */
    protected function getError()
    {
        return $this->error;
    }


    /**
     * 图片删除
     * @param $id  图片所有主键ID
     * @param int $userid 所属于用户ID
     * @return bool
     */
    protected function deleteFile($id, $userid = 0)
    {
        /**
         *
         * 根据要删除的文件名查询要删除的项,假如传值过来的是aid
         */
        $model = getHashAttrModel('Attachment', $userid, $this->table_number);
        $info = $model->getOne($id);
        if (empty($info)) {
            $this->error = '要删除的文件不存在';
            return false;
        }
        //判断用户是否具有删除的权限
        if ($userid > 0) {
            if ($this->userid != $userid) {
                $this->error = '您无权限删除此图片';
                return false;
            }
        } else {
            //只有管理员才能删除userid：0的信息
            if (!\think\Session::has('admininfo')) {
                $this->error = '您无权限删除此图片';
                return false;
            }
        }
        $file_url = $info['qiniu_url'];
        if (false === $model->deleteData($id)) {
            $this->error = '删除信息失败';
            return false;
        }


        /**
         * 查询是否此文件是否有其他占用,如果未占用则需要删除此信息，并且删除文件，否则只删除本条信息
         */
        $info = Loader::model('attachment/Attachment')->getOne(['md5' => $info['md5']]);
        /**
         * 删除文件
         */
        if (empty($info)) {
            //删除本地文件
            $src = SITE_PATH . $file_url;
            if (file_exists($src)) {
                if (false === unlink($src)) {
                    $this->error = '删除本地文件失败';
                    return false;
                }
            }
        }
        return true;
    }


}
